package com.example.domain.dto.order;

import com.example.domain.dto.MoneyDTO;
import com.example.domain.entity.Order;
import com.example.domain.entity.enums.OrderStatus;
import com.example.domain.valueobject.Money;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单详情DTO
 * 
 * <p><strong>注意：订单功能暂未开发，此DTO暂时未使用</strong></p>
 * 
 * @author Means
 * @since 2025-10-27
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderDTO {
    
    /**
     * 订单ID
     */
    private String id;
    
    /**
     * 订单号
     */
    private String orderNumber;
    
    /**
     * 用户ID（可选）
     */
    private String userId;
    
    /**
     * 会话ID（可选，用于匿名用户）
     */
    private String sessionId;
    
    /**
     * 购物车ID
     */
    private String cartId;
    
    /**
     * 订单状态
     */
    private OrderStatus status;
    
    /**
     * 状态描述
     */
    private String statusDesc;
    
    /**
     * 订单商品项列表
     */
    private List<OrderItemDTO> items;
    
    /**
     * 商品项数量
     */
    private Integer itemCount;
    
    /**
     * 小计金额（不含折扣）
     */
    private MoneyDTO subtotal;
    
    /**
     * 折扣金额
     */
    private MoneyDTO discount;
    
    /**
     * 应付总额
     */
    private MoneyDTO total;
    
    /**
     * 实付金额
     */
    private MoneyDTO paidAmount;
    
    /**
     * 支付方式
     */
    private String paymentMethod;
    
    /**
     * 支付时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime paidAt;
    
    /**
     * 备注
     */
    private String remarks;
    
    /**
     * 创建时间（下单时间）
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;
    
    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updatedAt;
    
    /**
     * 从实体类创建DTO（基础版本，不包含订单项）
     * 
     * @param order 订单实体
     * @return OrderDTO
     */
    public static OrderDTO from(Order order) {
        if (order == null) {
            return null;
        }
        
        return OrderDTO.builder()
                .id(order.getId())
                .orderNumber(order.getReceiptNumber())
                .userId(order.getUserId())
                .cartId(order.getCartId())
                .status(order.getStatus())
                .statusDesc(getStatusDescription(order.getStatus()))
                .subtotal(order.getSubtotal() != null ? MoneyDTO.from(Money.of(order.getSubtotal())) : null)
                .discount(order.getDiscountTotal() != null ? MoneyDTO.from(Money.of(order.getDiscountTotal())) : null)
                .total(order.getPayableAmount() != null ? MoneyDTO.from(Money.of(order.getPayableAmount())) : null)
                .paymentMethod(order.getPaymentId())
                .paidAt(order.getPaymentTime())
                .createdAt(order.getCreatedAt())
                .updatedAt(order.getUpdatedAt())
                .build();
    }
    
    /**
     * 获取状态描述
     * 
     * @param status 订单状态
     * @return 状态描述
     */
    private static String getStatusDescription(OrderStatus status) {
        if (status == null) {
            return null;
        }
        switch (status) {
            case PENDING_PAYMENT:
                return "待支付";
            case PAID:
                return "已支付";
            case CANCELLED:
                return "已取消";
            case REFUNDED:
                return "已退款";
            default:
                return status.name();
        }
    }
}

